package cc.aileron.commons.utility;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;

/**
 * Injector-utils
 * @author aileron
 *
 */
public class InjectorUtils
{
    /**
     * injector の生成
     * @param <T>
     * @param classObject
     * @param modules
     * @return
     */
    public static <T> T createInjector(
            final Class<? extends Module> moduleClass,
            final Class<T> classObject)
    {
        try
        {
            final Module module = moduleClass.newInstance();
            return Guice.createInjector(module).getInstance(classObject);
        }
        catch(Exception e)
        {
            throw new RuntimeException(e);
        }
    }
    
    /**
     * module から インスタンスの取得
     * @param <T>
     * @param module
     * @param classObject
     * @return
     */
    public static <T> T createInjector(
            final Module module,
            final Class<T> classObject)
    {
        return Guice.createInjector(module).getInstance(classObject);
    }
    
    /**
     * injector の生成
     * @param moduleClass
     * @return
     */
    public static Injector createInjector(final Class<? extends Module> moduleClass)
    {
        try
        {
            final Module module = moduleClass.newInstance();
            return Guice.createInjector(module);
        }
        catch(Exception e)
        {
            throw new RuntimeException(e);
        }
    }
}